import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Agerga los actores principales del juego dependiendo del nivel en el que se encuentre.
 * Evalua las vidas asi como el tipode escenario que se va a ir mostrando durante el transcurso del juego.
 * 
 * @author Jose Luis Sandoval Quintero 
 * @version 05-Junio-2012
 */
public class SpidermanWorld extends World
{
    private int nivel = 0; //Indica el nivel en que se encuentra el jeugo
    private int opcion = -1; //Indica que opcion del menu principal esta activada
    private int vidas = 10; //Indica el nuemro de vidas que tiene el jugador en cualquier instante del juego
    private int nBalas = 50; //Indica el numero de balas que tiene el jugador en cualquier instante del juego
    private int nAvances = 0; //contador que indica cuantos avances se lleva para ir mostrando un fondo diferente
    private int cont = 0; //Contador que te indica una pausa de 150 ciclos para mostrar la pantalla del nivel.
    private int cont2 = 0; //contador que indica cuando debe aparecer un colgante
    private int cont3 = 0;//contador que indica cuando debe aparecer un ninja en un colagnte
    private int cont4 = 0; // contador que indica cuando debe aparecer un enemigo al final de cada stage
    private int cont5 = 0; //contador para mostrar las imagenes del tercer nivel
    private boolean band = false; //Bandera que te indica en false cuando a sido un cambio de nivel 
    private boolean band2 = false; //Bandera que te indica en false cuando a sido un cambio de avanze en el fondo.
    private boolean band3 = false; //Bandera que te indica en false que solo se pueden agregar los objetos de cada nivel en cada ciclo del actua.
    private boolean iniJuego = false; //Bandera que te indica en true si ya inicio el juego
    private boolean esFinal = false; //Bandera que te indica en true si ya termino el jeugo
    private Texto textoV; //Texto que se utiliza para desplegar el numero de vidas en pantalla
    private Texto textoB; //Texto que se utiliza para desplegar el numero de Balas en pantalla
    private Texto textoN; //Texto que se utiliza para desplegar el nivel en el que se encuentra el juego
    GreenfootSound sound= new GreenfootSound("fondo1.mp3");;
   
    /**
     * Constructor de objetos de la Clase SpidermanWorld
     *  
     */
    public SpidermanWorld()
    {  
        super(700, 500, 1); 
        super.setPaintOrder( Telarana.class, MarieJane.class, Meta.class, VidaExtra.class,BalaExtra.class ,Texto.class,
                             GameOver.class, Bala.class, Spiderman.class, Enemigo.class, Bomba.class, Edificio.class );
        textoV = new Texto( " Vidas: " + String.valueOf( vidas ) );
        textoB = new Texto( " No Balas: " + String.valueOf( nBalas ) );
        textoN = new Texto( " Nivel " + String.valueOf( nivel + 1 ) );
        sound.setVolume(100);
        prepare();        
    }
    /**
     * Evalua y agrega al mundo los objetos pertenecientes a cada nivel del juego.
     * Despliega los menus correspondientes a si como los letreros que aparecen en el juego.
     */
    public void act()
    {
        sound.playLoop();
        if( opcion > -1 )    
        {
            this.eliminaObjetos();
            switch( opcion )
            {
                case 0:
                    nivel = 0;
                    vidas = 5; 
                    nBalas = 50;
                    nAvances = 0;
                    this.prepare();
                    break;
                case 1:  
                    iniJuego = true;
                    this.juegoNivel1();
                    break;
                case 2:
                    this.ayuda();
                    break;
                case 3:
                    this.creditos();
                    break;
            }
            opcion = -1;
        }
        if( nivel == 0 )
        {
            if( ! band2 && nivel == 0 )
            {
                if( nAvances == 4 )
                {
                    super.addObject( new VidaExtra(), Greenfoot.getRandomNumber( super.getWidth() ), Greenfoot.getRandomNumber( super.getHeight() - 10 ) );
                    super.addObject( new BalaExtra(), super.getWidth() - 1, Greenfoot.getRandomNumber( super.getHeight() - 10 ));
                    band2 = true;
                }
            }
            if( opcion == -2 )
            {
                this.eliminaObjetos();
                super.setBackground( "nivel1.png" );
                cont++;
            }
            if( cont == 150  )   
            {
                cont = 0;
                opcion = 1;
            } 
        }
        if( nivel == 1 )
        {
            if( !band2 )
            {
                cont++;
                super.setBackground( "nivel2.png" );
            }
            if( cont == 150 )
            {
                cont=0;
                band2 = true;
                super.setBackground("f2.png");
                this.juegoNivel2();
                band3 = true; 
            }
        }
        if( nivel == 2 )
        {
            addObject( new Lluvia(), Greenfoot.getRandomNumber( super.getWidth() ), 0 );
            if( !band2 )
            {
                cont++;
                super.removeObjects( super.getObjects( ExagonoG.class ) );
                super.removeObjects( super.getObjects( ExagonoC.class ) );
                super.setBackground( "nivel3.png" );
            }
            if( cont == 150 )
            {
                super.addObject( new Ninja( 0 ), 300 , 80 );
                cont=0;
                band2 = true;
                super.setBackground("f1n2_1.png");
                this.juegoNivel3();
                cont4 = 0;
                band3 = true; 
            }
        }
        if( nivel == 3 )
        {
            
            if( !band2 )
            {
                Edificio e = new Edificio();
                e.setImage( "e7.png" );
                super.addObject( new Spiderman(), 50 , 50 );
                super.addObject( new MarieJane(), 595, 90 );
                super.addObject( e, 509,  307 );
                iniJuego = false;
                band2 = true;
            }
        }
        textoV.actualizaTexto( " Vidas: " + String.valueOf( vidas ) );
        textoB.actualizaTexto( " No Balas: " + String.valueOf( nBalas ) );
        textoN.actualizaTexto(  " Nivel " + String.valueOf( nivel + 1 ) );
        if( ! band && nivel == 0 && iniJuego )
          this.evaluaAvanceN1();
        if( nivel == 1 && band2 )
            this.evaluaAvanceN2();
        if( nivel == 2 && band2 )
            this.evaluaAvanceN3();
        if( vidas == 0 )
        {
            this.eliminaObjetos();
            Actor gameOver = new GameOver();    
            super.addObject( gameOver, getWidth() / 2, getHeight() / 2 );
            vidas = 5;
            nAvances = 0;
        }
        if( esFinal )
        {
            eliminaObjetos();
            if( Greenfoot.isKeyDown( "space" ) )
            {
                esFinal = false;
                opcion = 0;
            }
        }
    }
    /**
     * Agrega al muendo los Actores pertenecientes al Nivel 1 del Juego dependiendo
     * del numero de avance en el que se encuentra el nivel.
     */
    public void evaluaAvanceN1()
    {        
        switch( nAvances )
        {
            case 0:
                 super.removeObjects( super.getObjects( Enemigo.class ) );
                 super.addObject( new Ninja( 0 ), 300 , 80 );
                 break;
            case 1:
                super.removeObjects( super.getObjects( Enemigo.class ) );
                addObject( new Ninja( 1 ), 300, getHeight() - 100 );
                break;
           case 2:
                super.removeObjects( super.getObjects( Enemigo.class ) );
                addObject( new Ninja( 0 ), 300, 50 );
                addObject( new Ninja( 1 ), 300, getHeight() - 100  );
                break;
           case 3:
                super.removeObjects( super.getObjects( Enemigo.class ) );
                addObject( new DuendeVerde(), getWidth() - 50, 100  );
                nAvances = 5;
                break;
        }
        band = true;
    }
    /**
     * Agrega al muendo los Actores pertenecientes al Nivel 2 del Juego dependiendo
     * de los contadores quienes indican el tiempo enque sale cada Colgante
     */
    public void evaluaAvanceN2()
    {
        cont2++;
        cont3++;
        cont4++;
        if( cont2 == 200 )
        {
            int y = Greenfoot.getRandomNumber( super.getHeight() );
            if( y >= 0 && y < 250 )
                y = y + Greenfoot.getRandomNumber( 500 );
            super.addObject( new ExagonoG(), super.getWidth(), y );
        }
        if( cont2 == 300 )
        {
            super.addObject( new ExagonoC(), super.getWidth(), Greenfoot.getRandomNumber( super.getHeight() / 2 - 50 ) );
            cont2 = 0;
        }
        if( cont3 == 750 )
        {
            int y = Greenfoot.getRandomNumber( super.getHeight() );
            if( y >= 0 && y < 250 )
                y = y + Greenfoot.getRandomNumber( 500 );
            super.addObject( new ExagonoG(), super.getWidth(), y );            
            super.addObject( new Ninja2( 1 ), super.getWidth() - 10, y - 10 );    
            cont3 = 0;
        }
        if( cont4 == 1500 )
        {
            cont2 = 0;
            cont3 = 0;
            cont4 = 0;
            super.addObject( new Lagarto(), super.getWidth() -20, 50 );
        }
    }
     /**
     * Agrega al muendo los Actores pertenecientes al Nivel 3 del Juego dependiendo
     * de los contadores quienes indican el tiempo enque sale cada Colgante
     */
    public void evaluaAvanceN3()
    {
        cont2++;
        cont3++;
        cont4++;
        cont5++;
        if( cont2 == 200 )
        {
            super.addObject( new Balancin(), super.getWidth() - 1, 38 );
            cont2 = 0;
        }
        if( cont3 == 700 )
        {
            int n = Greenfoot.getRandomNumber( 7 );
            Edificio e = new Edificio();
            switch( n )
            {
                case 0:
                    e.setImage( "e.png" );
                    break;
                case 1:
                    e.setImage( "e2.png" );
                    break;
                case 2:
                    e.setImage( "e3.png" );
                    break;
                case 3:
                    e.setImage( "e4.png" );
                    break;
                case 4:
                    e.setImage( "e5.png" );
                    break;
                case 5:
                    e.setImage( "e6.png" );
                    break;
                case 6:
                    e.setImage( "e7.png" );
                    break;
            }
            super.addObject( e, super.getWidth() - 1, 422 );
            cont3 = 0;
        }
        if( cont4 == 1500 )
        {
            super.addObject( new Venom(), super.getWidth() - 20, 50 );
        }
        if( cont5 > 0 && cont5 < 100 )
            super.setBackground( "f1n2_1.png" );
        if( cont5 > 100 && cont5 < 200 )
            super.setBackground( "f1n2_2.png" );
        if( cont5 > 200 && cont5 < 300 )
            super.setBackground( "f1n2_3.png" );
        if( cont5 > 300 && cont5 < 400 )
            super.setBackground( "f1n2_4.png" );
        if( cont5 > 400 && cont5 < 500 )
        {
            super.setBackground( "f1n2_5.png" );
            cont5 = 0;
        }
    }
     /**
     * Agrega al muendo los Actores iniciales del jeugo en el nivel 1 avance1
     */
    public void juegoNivel1()
    {
        Actor e1,e2,e3;
        e1 = new Edificio();
        e2 = new Edificio();
        e3 = new Edificio();
        e1.setImage( "e2.png" );
        e2.setImage( "e7.png" );
        e3.setImage( "e.png" );
        super.setBackground( "f1n1_3.png" );
        super.addObject( e1, 95, 373 );
        super.addObject( e2, 388, 282 );
        super.addObject( e3, 645, 319 );
        super.addObject( new Spiderman(), 82, 219 );
        super.addObject( this.textoV, 100, 15 );
        super.addObject( this.textoB, 200, 15 );
        super.addObject( this.textoN, 400, 15 );   
        super.addObject( new Ninja( 0 ), 300 , 80 );
    }
    /**
     * Agrega al muendo los Actores iniciales del jeugo en el nivel 2 avance1
     */
    public void juegoNivel2()
    {
        super.setBackground( "f2.png" );
        super.addObject( new ExagonoG(), 72, 269 );
        super.addObject( new ExagonoG(), 451, 256 );
        super.addObject( new ExagonoG(), 645, 319 );
        super.addObject( new ExagonoG(), 645, 319 );
        super.addObject( new ExagonoC(), 226, 98);
        super.addObject( new ExagonoC(), 645, 70 );
        super.addObject( new Ninja2( 1 ), 645, 319 );
        super.addObject( new Spiderman(), 50, 233 );
        
        super.addObject( this.textoV, 100, 15 );
        super.addObject( this.textoB, 200, 15 );  
    }
    /**
     * Agrega al muendo los Actores iniciales del jeugo en el nivel 3 avance1
     */
    public void juegoNivel3()
    {
        Actor e1,e2;
        e1 = new Edificio();
        e2 = new Edificio();
        e1.setImage( "e2.png" );
        e2.setImage( "e6.png" );
       super.setBackground( "f1n2_1.png" );
        super.addObject( new Balancin(), 105, 38 );
        super.addObject( new Balancin(), 343, 36 );
        super.addObject( new Balancin(), 524, 21 );
        super.addObject( e1, 117, 386 );
        super.addObject( e2, 618, 422 );
        super.addObject( new Spiderman(), 117, 233 );
        super.addObject( this.textoV, 100, 15 );
        super.addObject( this.textoB, 200, 15 );  
        
    }
    /**
     * Cambia el numero de vidas en una cantidad determinada
     * @param n numero de vidas a las que se va a cambiar
     */
    public void cambiaNvidas( int n )
    {
        this.vidas = n;
    }
    /**
     * Reegresa el valor de las vidas
     * @return Numero de vidas 
     */
    public int dameNvidas()
    {
        return vidas; 
    }
     /**
     * Cambia el numero de Balas en una cantidad determinada
     * @param n numero de Balas a las que se va a cambiar
     */
    public void cambiaNbalas( int n )
    {
        this.nBalas = n;
    }
     /**
     * Reegresa el valor de las Balas
     * @return Numero de Balas 
     */
    public int dameNbalas()
    {
        return nBalas;
    }
    /**
     * Aumenta en uno el nuemro de avances de fondo
     * ademas de poner la bandera que indica si cambio de avance en false.
     */
    public void cambiaNavances()
    {
        nAvances++;
        band = false;
    }
    /**
     * Regresa el valor de los Avances
     * @return Numero de avances
     */
    public int dameNavances()
    {
        return nAvances;
    }
    /**
     * Regresa el valor del nivel
     * @return nivel
     */
    public int getNivel()
    {
        return nivel;
    }
    /**
     * Aumenta el nivel en uno
     * Resetea el numero de avances y el contador para la pausa entre el cambio de niveles lo pone en cero
     * la bandera que indica el cambio en el numero de avance de fondo la pone en false.
     */
    public void avanzaNivel()
    {
        nivel++;
        nAvances=0;
        cont=0;
        band2 = false;
    }
    /**
     * Elimina todos los actores del mundo
     */
    public void eliminaObjetos()
    {
        super.removeObjects( super.getObjects( null ) );
    }
    /**
     * Cambia la opcion del menu 
     * @param o Opcion a cambiar en el menu para se evaluada
     */
    public void cambiaOpcion( int o )
    {
        opcion = o;
    }
    /**
     * Pone la pantalla principal del juego que es el menu con sus respectivos actores
     */
    private void prepare()
    {
        super.setBackground( "9186-1.png" );
        Mjugar jugar = new Mjugar();
        addObject(jugar, 388, 361);
        Mcreditos creditos = new Mcreditos();
        addObject(creditos, 387, 314);
        Mayuda mayuda = new Mayuda();
        addObject(mayuda, 390, 270);
    }
    /**
     * Cambia el fondo de la pantalla para mostrar la ayuda del juego
     */
    public void ayuda()
    {
        super.setBackground( "9186-2.png" );
        super.addObject( new Mok(), 654, 469  );
    }
    /**
     * Cambia el fondo de la pantalla para mostrar los creditos del juego
     */
    public void creditos()
    {
        super.setBackground( "9186-3.png" );
        super.addObject( new Mok(), 654, 469 );
    }
    /**
     * Cambia la bandera que te indica que es el final del juego a true.
     */
    public void cambiaEsFinal()
    {
        esFinal = true;
    }
}